import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * En esta clase se encuentran todos los métodos y variables de la clase Falcon, la cual es un enemigo en el juego.
 * 
 * @author Ulises Yamil Castorena Caldera
 * @version 1.0
 */
public class Falcon extends Targets
{
    private GreenfootImage falcoR[];//Arreglo que contiene las imagenes del halcon viendo hacia la derecha
    private GreenfootImage falcoL[];//Arreglo que contiene las imagenes del halcon viendo hacia la izquierda
    private GreenfootSound hawk;//Variable que guarda el sonido
    private GreenfootImage prohi;//Variable que gusrda una imagen de prohibido
    private boolean ocupado;//Variable que indica si el halcon está ocupado realizando acciones
    
    /**
     * Constructor de la clase Falcon.
     * @param valor Es el valor de la dirección, si es cero es a la izquierda, si es uno a la derecha.
     */
    public Falcon(int valor)
    {             
        ocupado = false;
        direccion = valor;       
        hawk = new GreenfootSound("hawk.mp3");
        falcoR = new GreenfootImage [9];
        falcoL = new GreenfootImage [9];           
        prohi = new GreenfootImage("prohibido.png");
        prohi.scale(50,50);
        for(int a = 0;a < 9;a++)
            falcoR[a] = new GreenfootImage("halcon" + a + ".png");
        for(int a = 0;a < 9;a++)
        {
            falcoL[a] = new GreenfootImage("halcon" + a + ".png");
            falcoL[a].mirrorHorizontally();
        }
    }
    
    /**
     * Método Act de la clase.
     */
    public void act() 
    {
        if(vivo)
        {            
            if(!ocupado)
            {
                mueve(); 
                eliminaFalcon();
                if(Greenfoot.getRandomNumber(20) == 5)
                {
                    ocupado = true;
                    cont = 0;                                     
                }
            }
            else
            {
                quieto();
            }
        }
        else
        {   
            if(cont < 20)
                espera();
            else
                eliminaFalcon();
        }
    }  
    
    /**
     * Método que cambia la imagen del halcon para mostrar una donde este no se mueve, para que se continue moviendo en dirección horizontal
     * es necesario se utiliza un número aleatorio.
     */
    public void quieto()
    {   
        if(direccion == 0)
        {
            if(seleccion)
            {
                setImage(falcoR[cont]);
                cont++;
            }
            else
            {
                cont--;
                setImage(falcoR[cont]);
            }
        }       
        else
        {
            if(seleccion)
            {
                setImage(falcoL[cont]);
                cont++;
            }
            else
            {
                cont--;
                setImage(falcoL[cont]);
            }
        }
        if(cont == 8)        
            seleccion = false;
        if(cont == 0)
            seleccion = true;
        if(Greenfoot.getRandomNumber(20) == 5)
        {
            seleccion = true;
            ocupado = false;
        }
    }
    
    /**
     * Método que mueve el halcon, según los pixeles que se deseen.
     */
    public void mueve()
    {
        if(direccion == 0)
        {
            setImage(falcoR[8]);        
            move(-4);
        }
        else    
        {
            setImage(falcoL[8]);
            move(4);
        }
    }
    
    /**
     * Elimina al Falcon dependiendo de la situación, si llega al final de la pantalla o si este esta muerto.
     */
    public void eliminaFalcon()
    {
        if(vivo)
        {
            if(direccion == 1)
            {
                if(getX() == getWorld().getWidth() - 1)
                    getWorld().removeObject(this);
            }
            else
            {
                if(getX() == 0)
                     getWorld().removeObject(this);
            }
        }
        else
        {
            getWorld().removeObject(this);
        }
    }
    
    /**
     * Método que coloca una imagen en donde estaba el Falcon.
     */
    public void espera()
    {
        setImage(prohi);        
        cont++;
    }
    
    /**
     * Cambia el estado de vivo a muerto y llama un método que modifica el score.
     */
    public void cambiaVivo()
    {
        if(vivo)
            modificaScore();
        vivo = false;        
        cont = 0;        
    }
    
    /**
     * Realiza una llamada a un método del mundo y cambia el score.
     */
    public void modificaScore()
    {
        World mundo = getWorld();
        if(((DuckWorld)mundo).returnScore() > 0)
            ((DuckWorld)mundo).incrementaScore(-((DuckWorld)mundo).returnScore());
        else if(((DuckWorld)mundo).returnScore() < 0)
            ((DuckWorld)mundo).incrementaScore(((DuckWorld)mundo).returnScore());
        else
            ((DuckWorld)mundo).incrementaScore(-100);
    }
}
